// Promise是一个构造函数
//  构造函数有两个属性。PromiseState   PromiseResult

function Promise(executor) {
    this.PromiseState = 'pending';
    this.PromiseResult = undefined;
    // 增加一个属性，用来存放成功或失败的回调函数
    this.callbacks = [];

    let resolve = (value) => {
        if (this.PromiseState !== 'pending') return;
        this.PromiseState = 'fulfilled';
        this.PromiseResult = value;
        // 这里是确定成功，执行所有成功回调即可
        if (this.callbacks.length) {
            this.callbacks.forEach(item => {
                item.success();
            })
        }
    }
    let reject = (reason) => {
        if (this.PromiseState !== 'pending') return;
        this.PromiseState = 'rejected';
        this.PromiseResult = reason;
        // 这里是确定失败，执行所有失败回调即可
        if (this.callbacks.length) {
            this.callbacks.forEach(item => {
                item.fail();
            })
        }
    }
    try {
        executor(resolve, reject);
    } catch (e) {
        reject(e);
    }
}
// 1. 添加then方法
// 2. 在哪里添加？
/**
 * 
 * @param {*} onResolved : 成功的回调
 * @param {*} onRejected ： 失败的回调
 */
Promise.prototype.then = function (onResolved, onRejected) {
    console.log('then 中的 state', this.PromiseState);
    // 如果状态是成功的，那么执行then成功的回调
    if (this.PromiseState === 'fulfilled') {
        // 将成功的结果值传递
        onResolved(this.PromiseResult);
    }
    // 如果状态是失败的，那么执行失败的回调
    if (this.PromiseState === 'rejected') {
        // 将失败的结果值传递
        onRejected(this.PromiseResult);
    }
    // 异步需要在pending中单独处理
    if (this.PromiseState === 'pending') {
        console.log('我准备好处理了')
        // 我们想执行成功或失败的回调【根据你的状态】，但你的状态确实pending。那我执行成功或失败都不合适。
        // 确定成功状态下，执行成功的回调 onResolved
        // 确定失败的状态，执行失败的回调 onRejected
        // 我们是pending，我们不能执行，但是我们可以存起来
        this.callbacks.push({
            success: () => {
                onResolved(this.PromiseResult);
            },
            fail: () => {
                onRejected(this.PromiseResult);
            }
        })


    }
}